﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;
using System.Collections;
using Cinemas = LI4SilverWCF.bus.Cinemas;

namespace LI4SilverWCF.data
{

    class DBCinemas
    {
        OdbcConnection con;
        public DBCinemas(OdbcConnection c)
        {
            con = c;
        }

        public bool verificaUnicidadeCinema(String nome)
        {
            string query = "SELECT COD_CINEMA FROM CINEMA WHERE NOME_CINEMA = '" + nome + "'";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();
            bool unico = false;

            try
            {
                if (!reader.HasRows) unico = true;
            }
            catch (Exception e)
            {
            }
            con.Close();
            return unico;
        }

        public void inserirNomeDadosCinema(String nome, String local, double latitude, double longitude)
        {
            string query;
            int cod_local = 0;
            query = "SELECT COD_LOCAL FROM LOCALIDADE WHERE LOCALIDADE = '" + local + "'";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                    cod_local = reader.GetInt32(0);
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO PROCURAR CODIGO LOCALIDADE:" + e);
            }
            con.Close();

            query = "INSERT INTO CINEMA (COD_LOCAL, NOME_CINEMA, LATITUDE, LONGITUDE) VALUES (" + cod_local + ",'" + nome + "', " + latitude.ToString().Replace(",", ".") + ", " + longitude.ToString().Replace(",", ".") + ")";
            command = new OdbcCommand(query, con);
            con.Open();
            try
            {
                command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO INSERIR CINEMA: " + e);
            }
            con.Close();
        }

        public Hashtable obterListaCinemas()
        {
            Hashtable lista = new Hashtable();
            string query = "SELECT COD_CINEMA, NOME_CINEMA FROM CINEMA";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();

            try
            {
                while (reader.Read())
                {
                    lista.Add(reader.GetInt32(0), reader.GetString(1));
                }

            }
            catch (Exception e)
            {
            }
            con.Close();
            return lista;
        }

        public void obterDadosCinema(String nome, Cinemas c)
        {
            string query = "SELECT COD_CINEMA, LOCALIDADE, LATITUDE, LONGITUDE "
                          + "FROM CINEMA INNER JOIN LOCALIDADE ON CINEMA.COD_LOCAL = LOCALIDADE.COD_LOCAL "
                          + "WHERE NOME_CINEMA = '" + nome + "'";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();

            try
            {
                while (reader.Read())
                {
                    if (!reader.IsDBNull(0)) c.codigoCinema = (int)reader.GetInt32(0);
                    if (!reader.IsDBNull(1)) c.localidade = reader.GetString(1);
                    if (!reader.IsDBNull(2)) c.latitude = (double)reader.GetDouble(2);
                    if (!reader.IsDBNull(3)) c.longitude = (double)reader.GetDouble(3);
                }

            }
            catch (Exception e)
            {
            }
            con.Close();
        }


        public void removerCinema(String nome)
        {
            string query = "DELETE FROM CINEMA WHERE NOME_CINEMA = '" + nome + "'";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            int rows = 0;
            try
            {
                rows = command.ExecuteNonQuery();
                Console.WriteLine(rows);
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO REMOVER DADOS CINEMA: " + e);
            }
            con.Close();
        }

        public void alteraNomeDadosCinema(String nome, String novoNome, String local, double latitude, double longitude)
        {
            string query;
            int cod_local = 0;
            query = "SELECT COD_LOCAL FROM LOCALIDADE WHERE LOCALIDADE = '" + local + "'";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                    cod_local = reader.GetInt32(0);
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO PROCURAR CODIGO LOCALIDADE:" + e);
            }
            con.Close();
            query = "UPDATE CINEMA SET COD_LOCAL= " + cod_local + ", NOME_CINEMA = '" + novoNome + "', LATITUDE = " + latitude.ToString().Replace(",", ".") + ", LONGITUDE = " + longitude.ToString().Replace(",", ".") + " WHERE NOME_CINEMA = '" + nome + "'";
            command = new OdbcCommand(query, con);
            con.Open();
            try
            {
                command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO ALTERAR CINEMA: " + e);
            }
            con.Close();
        }

        public ArrayList obterLocalidades()
        {
            ArrayList localidades = new ArrayList();
            string query = "SELECT DISTINCT LOCALIDADE FROM CINEMA INNER JOIN LOCALIDADE ON CINEMA.COD_LOCAL = LOCALIDADE.COD_LOCAL";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                    localidades.Add(reader.GetString(0));
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO PROCURAR LOCALIDADES CINEMA:" + e);
            }
            con.Close();
            return localidades;
        }

        public ArrayList obterCinemas(String localidade)
        {
            ArrayList cinemas = new ArrayList();
            string query = "SELECT NOME_CINEMA FROM CINEMA INNER JOIN LOCALIDADE ON CINEMA.COD_LOCAL = LOCALIDADE.COD_LOCAL WHERE LOCALIDADE = '" + localidade + "'";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                    cinemas.Add(reader.GetString(0));
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO PROCURAR CINEMAS:" + e);
            }
            con.Close();
            return cinemas;
        }

        public void obterCoordenadas(String nome, Cinemas c)
        {
            string query = "SELECT LATITUDE, LONGITUDE FROM CINEMA WHERE NOME_CINEMA = '" + nome + "'";
            OdbcCommand command = new OdbcCommand(query, con);
            con.Open();
            OdbcDataReader reader = command.ExecuteReader();
            try
            {
                while (reader.Read())
                {
                    c.latitude = reader.GetDouble(0);
                    c.longitude = reader.GetDouble(1);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("ERRO AO OBTER COORDENADAS CINEMA:" + e);
            }
            con.Close();
        }

    }
}